package com.zang.jvm;

import java.util.ArrayList;
import java.util.List;

/**
 * OutOfMemoryError 内存溢出测试
 * 第一，通过代码验证Java虚拟机规范中描述的各个运行时区域存储的内容；
 * 第二，希望能在工作中遇到实际的内存溢出异常时，根据异常的信息快速判断是哪个区域的内存溢出，知道什么样的代码可能会导致这些区域内存溢出，以及出现这些异常后该如何处理
 * @author Zhang Qiang
 * @date 2019/12/12 15:03
 */
public class OutOfMemoryErrorAction {

}

/**
 * run jvm set 'VM arguments' :
 * VM options:-Xms20M -Xmx20M -Xmn10M -XX:+HeapDumpOnOutOfMemoryError
 * or
 * -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
 * -Xms:初始堆大小(最小堆)。
 * -Xmx:最大堆大小。
 * -Xmn:年轻代大小（Sun官方推荐配置为整个堆的3/8）。
 * -Xss:每个线程的堆大小（在相同物理内存下，减小这个值能生成更多的线程）。
 * -Xms  和 -Xmx  设置成一致的值可以避免堆自动扩展。
 * JVM内存大小 = 年轻代大小 + 老年代大小 + 持久代大小（perm）。
 */
class HeapOOM {
    static class OOMObject{
    }

    public static void main(String[] args) throws InterruptedException {
        List<OOMObject> oList = new ArrayList<>();
        int a = 0;
        while (true) {
            a ++;
            oList.add(new OOMObject());
            if (a%1000 == 0){
                Thread.sleep(100);
                System.out.println(" a ==== " + a);
            }
        }
    }
}
